Для того, чтобы не было тупиковых ситуаций race condition придумали
mutex
Ни процец П1 ни П2 не исполнится, так как у них одни и те же ресурсы.
Алгоритм банкира - после того как один процесс используется он освоюождает ресурс, банкир должен быть уверен в том что процес вернет ресурс, Если возникает тупиковая ситуация, тогда необходимо убить ресурс.
Критическая секция - закрытие ресурса ,если ресурс занят. Если ресур занят закрываем семафор. Можно в семафоре установить значение 500, если он свободен. Как только документ устанавливается мы сбрасываем значение семафоров.
Семафор указывает на входе двери ресурс занят или ресрс свободен или он заполнен на половину и может принять сколько то процессов.
Семафоры - это целая разделяемая переменная с неотрицательными значениями,доступ любого процесса к которой может осуществляться только через две атомарные операции. P - proberen - проверять V-verhogen - увеличивать (от датских слов)
(P,S)
P(S) - пока s=0 процесс блокируется; S=S-1 - процесс блокируется
При выполнении операции P над семафором S сначало проверяетя его значение, если оно больше 0, то из s=s-1 , если оно меньше или равно нулю, то процесс блокируется до тех пор, пока S - не станет больше 0.
После чего из S вычитается 1, при выполнении операции V (увеличении) над семафором (S) к его значению просто прибавляется 1.
в момент создания семафор может принимать любое не отрицательное значение. Процесс , когда подходит к критической секции он проверяет значение семафора.
Семафоры встроены на все операционные системы. В некоторые Ос они встроены в синтаксис. решение проблемыили решение задачи (производитель - потребитель) producer-consumer (производитель потребитель)
процессы обмениваются инфо, они могут использовать для них буфер.
Задача писателя-читателя
Пусть два процесса обмениваются информацией через буфер. Буфер ограниченного размера.
Производитель закладывает инфу в буфер , а потребитель считывает эту инфу из буфера.
Producer
while(1) {
produce item;
fn1, item
}
consume
while(1) {
get item
consume item
}
Буфер ограниченного размера мы не может туда записывать информацию. потребитель, если буфер пуст потребитель должен ждать пока туда запишуь какуе-то инфу.
Как эта задача решает с помощью семафоров?
Возьмем 3 семафора:
Cемафор empty - производитель записывает инфу только тогда,
когда буфер свободен.
Семафор fn1 - будем использовать для организации ожидания производителя
при заполненном буфере.
Семафор full - будем использовать для гарантии того , что потребитель
будет ждать пока в буфере появится информация.
Семафор mutex - для организации взаимоисключения
на критических участках.
В данном случае участки - это put item и get item.
Взаимоисключения - механизм , которых используется для того чтобы два ресурса не стали состязаться за ресурс, а использоваться в необходимое для каждого время.
Пока P(s):S==0, блок; S=S-1; V(S):S=S+1 O<-(1)
P - проверка семафора V- действие над семафором (увеличение над семафоров) Semaphor mutex = 1; //т.е. ресурс свободен, буфер пуст - то что произ изводитель ожидает пока освободиться буфер semaphor empty =N; semaphor full=0;
Producer: //(записывает инфу)
while(1){
produce item;
P(empty);
P(mutex)
putt item //наложить
v(mutex) //увеличиваем mutex
v(full) //увеличиваем full
}
consumer//(считывает)
while(1){
P(full)
P(mutex)
get item
v(mutex)
V(empty) //как только буфер освободиться
//записать туда информацию
}
P означает действие семафора s=s-1
v - увеличиваем ресурс ,S - освобождает
Семафор может быть не только двоичный. Если ресурс либо занят либо свободен, он может иметь только два состояния.
consumer - следит за семафорами, проверяет их на свободу.
есть процесс producer, есть процесс consumer.
Чтобы не возникло конфликтов мы блокируем критическую секцию, наш ресурс
это наш буфер.
Семафор в Linux -это модуль ядра, они подключают библиотеки, их пишут на assembler т.е. в винде мы все прописываем самостоятель и управляем ими, в линуксе подключаем библиотеку.
asm/semafore - подключаем библиотеку все фигня прописана в библиотеки семафор в линуксе это типа как прописано инициализация в библиотеки псевдокод для линукса down - добавляем 1 up - увеличиваем void sema_init(strint, semainit) используется алгоритм fifo (кто первый пришел, тот и использует ресурс).
Аппаратная реализация семафоров - (запрет прерываний, прерывания, замок).
Монитор - механизм синхронизации, совокупность процедур предназначенная для управления ресурсами определенного типа.
Монитор отвечает за распределение ресурсов, а также контролирует обращение к ним со стороны различных программ. Он полностью отвечает за те ресурсы, которые ему выданы. Это тоже механизм организации параллелизма, который содержит данные и процедуры необходимые для динамического распределения какого-либо общего ресурса или группы общих ресурсов. Чтобы обеспечить выделение необходимого ресурса процесс должен обратиться к конкретной процедуре монитора. Если ресурс занят, то монитор выдает команду wait и процесс, который пожелал войти в монитор должен ожидать вне монитора освобождение этого монитора.
Тогда процесс пожелавший войти в монитор должен ожидать вне монитора. Процесс, который пожелал войти в монитор ожидает его освобождения.
wait
signal
Монитор - набор процедур.
Некоторый процессы могут выйти из монитора не выполнив все процедуры
до конца.
Те процессы, которые побывали в мониторе ОС ставит их в отдельную очередь.
Очередь - уснувшие процессы.
Когда монитор освободиться в следующий раз, он просматривает очередь
уснувших процессов.
wait(имя, условие)
signal(имя, условие)
Команда wait выполнятся движением запрещенных прерываний и уменьшает содержимое счетчика на 1. Если счетчик меньше 0, то процесс помещается в очередь ожидающих открытие этого монитора и процессор освобождается от этого монитора. Процессор освобождается от этого процесса.
signal -работает в режиме запрещенных прерываний. как только процесс освободился он выбирает из очереди и уменьшает значение счетчика. На абстрактном уровне можно описать структуру мониторого таким образом.
monitor monitor_name {
описание внутренних переменных
void m1()
void mn
блок инициализации внутренних переменных
}
m1, m2,...,mn - это функции-методы монитора
Блок инициализации внутренних переменных содержит операции, которые выполняются тольк один раз. Либо при создании монитора, либо при самом первом вызове функции и метода монитора.
В задаче produce consume - тоже применимы мониторы. параллельный эвклид и параллельный паскаль эмуляция монитора с помощью системных вызовов для обычных языков программирования. которые широко распространены не так проста, как эмуляция семафора, поэтому в некоторых случаях мониторы применяются в ОС.
Сообщения - механизм синхронизации (также как семафоры и мониторы)
Для примеров адресации достаточно описать два типа - это приметивы для описания передачи
сообщения процессам по линии связи.
send(p, message) //послать сообщение message процессу p
receire(0,message)
в случа не прямой адресации нам нужен ящик куда мы будем отправлять сообщения
send(A, message)//отправить сообщение в ящик А
receire(A,message)//получить сообщение из ящика А
В сообщениях более проста реализая, но передача происходит по более высокоуровнемым организациям. Они между собой эквивалентны. выполняют одну и ту же функцию. Их реализуют мониторы с помощью передачи сообщений.
За управление процессами отвечают определенные менеджеры
Диспетчер - это программа ОС , которая рпинимает решение о том, какой процесс должен быть запущен в данный момент. и устанавливает машинный счетчик команд, которые содержат адрес следующей выполняемой проги.(команды)
Что делает менеджер управления процессами?
Блок управления процессами или подсистема управлния процессами.
менеджер раздает процессору в распоряжение время.
Планировщик работает с определенным алгоритмом планирования.
сможет ли боле приоритетное время вытеснить выполняемую задачу.
Если мы его сможем вытеснить мы должны выполнить прерывание, установить занятость
процесса. выкинутый процесс мы ставим в очередь. он переходит в состояние
готовности.
в регистре тоже записываются состояния программы. Дескриптор - описывает
именно сам процесс, динамическая таблица.
Сохраняет информацию предсмртную записку.
Процесс с таким-то номером убил другой.
В следующий раз проведут контрольную работу по процессам по базовым понятия рассказать о жизненном цикле процесса и описать коротко.